﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Teste.Estados
{
    class StateManager<K>
    {
        #region Atributos
        public StateBase Current
        {
            get { return _current; }
        }

        private IDictionary<K, StateBase> _states;
        private StateBase _current;
        #endregion

        #region Construtores
        public StateManager()
        {
            _states = new Dictionary<K, StateBase>();
        }
        #endregion

        #region Operadores
        #endregion

        #region Métodos
        public StateManager<K> Register(K key, StateBase state)
        {
            _states.Add(key, state);

            return this;
        }

        public void GoTo(K key)
        {
            StateBase newState = _states[key];

            // XXX e se quisermos reiniciar o estado?
            if (newState == Current)
            {
                return; // é o mesmo estado, nada a fazer
            }

            if (Current != null)
            {
                Current.Terminate(); // termina o estado atual
            }

            _current = newState; // o novo estado agora é o atual

            if (Current != null)
            {
                Current.Start(); // começa o novo estado
            }
        }
        #endregion
    }
}
